from flask import Blueprint
from flask_restx import Api

# 创建文档蓝图
doc_bp = Blueprint('swagger_docs', __name__)

# 配置Flask-RESTX
api = Api(
    doc_bp,
    version='1.0',
    title='恋爱管理系统 API 文档',
    description='恋爱管理系统后端API接口文档',
    doc='/docs/',  # Swagger UI路径
    contact='开发团队',
    contact_email='admin@example.com',
    authorizations={
        'Bearer': {
            'type': 'apiKey',
            'in': 'header',
            'name': 'Authorization',
            'description': 'JWT Token格式: Bearer <token>'
        }
    },
    security='Bearer'
)

# 定义通用响应模型
from flask_restx import fields

# 成功响应模型
success_response_model = api.model('SuccessResponse', {
    'code': fields.Integer(required=True, description='状态码', example=200),
    'message': fields.String(required=True, description='响应消息', example='操作成功'),
    'data': fields.Raw(description='响应数据')
})

# 错误响应模型
error_response_model = api.model('ErrorResponse', {
    'code': fields.Integer(required=True, description='错误码', example=400),
    'message': fields.String(required=True, description='错误消息', example='请求参数错误'),
    'data': fields.Raw(description='错误详情')
})

# 分页响应模型
pagination_model = api.model('PaginationData', {
    'page': fields.Integer(required=True, description='当前页码'),
    'limit': fields.Integer(required=True, description='每页数量'), 
    'total': fields.Integer(required=True, description='总数量'),
    'data': fields.List(fields.Raw, description='数据列表')
})

pagination_response_model = api.model('PaginationResponse', {
    'code': fields.Integer(required=True, description='状态码', example=200),
    'message': fields.String(required=True, description='响应消息', example='获取成功'),
    'data': fields.Nested(pagination_model, description='分页数据')
})

# 管理员相关模型
admin_model = api.model('Admin', {
    'id': fields.Integer(required=True, description='管理员ID'),
    'admin_name': fields.String(required=True, description='管理员名称'),
    'username': fields.String(required=True, description='用户名'),
    'email': fields.String(description='邮箱'),
    'phone': fields.String(description='手机号'),
    'status': fields.Boolean(description='状态'),
    'department_id': fields.Integer(description='部门ID'),
    'role_id': fields.Integer(description='角色ID'),
    'created_at': fields.String(description='创建时间'),
    'updated_at': fields.String(description='更新时间')
})

login_request_model = api.model('LoginRequest', {
    'username': fields.String(required=True, description='用户名', example='admin'),
    'password': fields.String(required=True, description='密码', example='123456')
})

login_response_data_model = api.model('LoginResponseData', {
    'token': fields.String(required=True, description='JWT Token'),
    'admin_info': fields.Nested(admin_model, description='管理员信息')
})

login_response_model = api.model('LoginResponse', {
    'code': fields.Integer(required=True, description='状态码', example=200),
    'message': fields.String(required=True, description='响应消息', example='登录成功'),
    'data': fields.Nested(login_response_data_model, description='登录数据')
})

# 部门模型
department_model = api.model('Department', {
    'id': fields.Integer(required=True, description='部门ID'),
    'name': fields.String(required=True, description='部门名称'),
    'description': fields.String(description='部门描述'),
    'parent_id': fields.Integer(description='父级部门ID'),
    'sort': fields.Integer(description='排序'),
    'status': fields.Boolean(description='状态'),
    'created_at': fields.String(description='创建时间'),
    'updated_at': fields.String(description='更新时间')
})

# 菜单模型
menu_model = api.model('Menu', {
    'id': fields.Integer(required=True, description='菜单ID'),
    'name': fields.String(required=True, description='菜单名称'),
    'path': fields.String(description='菜单路径'),
    'component': fields.String(description='组件路径'),
    'icon': fields.String(description='菜单图标'),
    'parent_id': fields.Integer(description='父级菜单ID'),
    'sort': fields.Integer(description='排序'),
    'visible': fields.Boolean(description='是否可见'),
    'type': fields.String(description='菜单类型'),
    'permission': fields.String(description='权限标识'),
    'created_at': fields.String(description='创建时间'),
    'updated_at': fields.String(description='更新时间'),
    'children': fields.List(fields.Raw, description='子菜单列表')
})

# 角色模型
role_model = api.model('Role', {
    'id': fields.Integer(required=True, description='角色ID'),
    'name': fields.String(required=True, description='角色名称'),
    'description': fields.String(description='角色描述'),
    'data_scope': fields.String(description='数据权限范围'),
    'status': fields.Boolean(description='状态'),
    'created_at': fields.String(description='创建时间'),
    'updated_at': fields.String(description='更新时间')
})

# 用户模型
user_model = api.model('User', {
    'id': fields.Integer(required=True, description='用户ID'),
    'username': fields.String(required=True, description='用户名'),
    'email': fields.String(description='邮箱'),
    'phone': fields.String(description='手机号'),
    'status': fields.Boolean(description='状态'),
    'created_at': fields.String(description='创建时间'),
    'updated_at': fields.String(description='更新时间')
})

# 注册API命名空间
def register_namespaces():
    """注册所有API命名空间"""
    try:
        # 认证相关接口
        from app.api_docs.auth import auth_ns
        api.add_namespace(auth_ns, path='/auth')
        
        # 用户认证接口（小程序）
        try:
            from app.api_docs.user_auth import user_auth_ns
            api.add_namespace(user_auth_ns, path='/auth/v1')
        except ImportError as e:
            print(f"Warning: Failed to import user auth docs: {e}")
        
        # 管理员管理接口
        from app.api_docs.admins import admin_ns
        api.add_namespace(admin_ns, path='/admins')
        
        # 角色管理接口
        from app.api_docs.roles import role_ns
        api.add_namespace(role_ns, path='/roles')
        
        # 菜单管理接口
        from app.api_docs.menus import menu_ns
        api.add_namespace(menu_ns, path='/menus')
        
        # 用户管理接口
        from app.api_docs.users import user_ns
        api.add_namespace(user_ns, path='/users')
        
        # 部门管理接口
        from app.api_docs.departments import dept_ns
        api.add_namespace(dept_ns, path='/departments')
        
        # 字典管理接口
        from app.api_docs.dictionaries import dict_ns
        api.add_namespace(dict_ns, path='/dictionaries')
        
        # 文件管理接口
        from app.api_docs.files import file_ns
        api.add_namespace(file_ns, path='/files')
        
        # 用户审核接口
        try:
            from app.api_docs.user_review import user_review_ns
            api.add_namespace(user_review_ns, path='/user-review')
        except ImportError as e:
            print(f"Warning: Failed to import user review docs: {e}")
        
        # 小程序端用户接口（profile / photos / mate-criteria 等）
        try:
            from app.api.users.v1 import api as user_v1_api
            for ns in user_v1_api.namespaces:
                api.add_namespace(ns, path='/users/v1')
        except ImportError as e:
            print(f"Warning: Failed to import user v1 namespaces: {e}")
        
        # 管理员端接口（自动收集 admin/v1 下所有命名空间，包括 banners ）
        try:
            from app.api.admin.v1 import api as admin_v1_api
            for ns in admin_v1_api.namespaces:
                api.add_namespace(ns, path='/admin/v1')
        except ImportError as e:
            print(f"Warning: Failed to import admin v1 namespaces: {e}")
        
    except ImportError as e:
        print(f"Warning: Failed to import API docs module: {e}")
        pass

# 自动注册命名空间
register_namespaces()

# 导出模型供其他模块使用
__all__ = [
    'doc_bp', 'api', 
    'success_response_model', 'error_response_model', 'pagination_response_model',
    'admin_model', 'login_request_model', 'login_response_model',
    'department_model', 'menu_model', 'role_model', 'user_model'
] 